package com.example.coreshopapp.utils;

import android.annotation.SuppressLint;
import android.os.Build;
import android.util.Log;

import com.alibaba.fastjson.JSON;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;

public class TimeUtils {
    //处理时区差异
    private static final TimeZone timeZone = TimeZone.getTimeZone("Asia/Shanghai");
    private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

    // 时间注意地区问题,过去距今多少分钟 getTime(获取时间戳)
    public long calculateTimeDifferenceInMinutes(long pastTime, String resultType) {
        // 获取当前北京时间
        ZonedDateTime beijingTime = ZonedDateTime.now(ZoneId.of("Asia/Shanghai"));
        // 转换为 LocalDateTime
        LocalDateTime localDateTimeInBeijing = beijingTime.toLocalDateTime();
        // 将 LocalDateTime 转换为 ZonedDateTime
        ZonedDateTime zonedDateTime = localDateTimeInBeijing.atZone(ZoneId.of("Asia/Shanghai"));
        // 获取时间戳 (秒)
        long timestampInSeconds = zonedDateTime.toInstant().getEpochSecond();
        // 获取时间戳 (毫秒)
        long timestampInMillis = zonedDateTime.toInstant().toEpochMilli();

        // 计算时间差，单位：毫秒
        long timeDifference = timestampInMillis - pastTime;

        long minute = timeDifference / 1000 / 60;
        if (resultType == "hour") {
            // 将毫秒转化为分钟
            return minute / 60;
        } else if (resultType == "second") {
            return minute * 60;
        } else {
            return minute;
        }
    }

    // 将字符串格式改为Date格式
    public Date changeTime(String time) {
        try {
            // 定义日期格式，与字符串中的格式一致
            SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault());
            sdf1.setTimeZone(timeZone);
            // 解析字符串为 Date 对象
            Date date = sdf1.parse(time);
            return date;
        } catch (Exception e) {
            e.printStackTrace();
            return new Date();
        }
    }

    // 将Date转换为string
    public String changeDate(Date time) {
        // 定义日期格式，与字符串中的格式一致
        SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault());
        sdf1.setTimeZone(timeZone);
        // 解析字符串为 Date 对象
        sdf1.setTimeZone(timeZone);
        String format = sdf1.format(time);
        return format;

    }


    // 获取年月日时间
    public String getOrderNo() {
        SimpleDateFormat yyyyMMdd = new SimpleDateFormat("yyyyMMdd");
        yyyyMMdd.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
        // 获取当前时间
        Date currentDate = new Date();
        // 格式化当前时间
        return yyyyMMdd.format(currentDate);
    }

    // 获取当前时间
    public static String getCurrentTime(String type) {
        SimpleDateFormat yyyyMMdd = new SimpleDateFormat(type);
        yyyyMMdd.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
        // 获取当前时间
        Date currentDate = new Date();
        // 格式化当前时间
        return yyyyMMdd.format(currentDate);
    }

    // 无参方法，调用时默认 yyyy-MM-dd HH:mm:ss
    public static String getCurrentTime() {
        return getCurrentTime("yyyy-MM-dd HH:mm:ss");
    }

    // 根据传入天数获取时间
    public static String getDateOffset(int days, String format) {
        try {
            // 设置时区为上海
            TimeZone tz = TimeZone.getTimeZone("Asia/Shanghai");
            SimpleDateFormat sdf = new SimpleDateFormat(format);
            sdf.setTimeZone(tz);

            // 获取当前日期
            Calendar calendar = Calendar.getInstance(tz);
            calendar.add(Calendar.DAY_OF_MONTH, days); // 偏移天数

            Date resultDate = calendar.getTime();
            return sdf.format(resultDate);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    // 将日期字符串转换为时间戳
    public static long convertToTimestamp(String dateString, String format) {
        // 定义日期格式与字符串匹配
        @SuppressLint("SimpleDateFormat") SimpleDateFormat sdf = new SimpleDateFormat(format);
        sdf.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai")); // 设置为 UTC 时区（可选）
        try {
            // 解析日期字符串
            Date date = sdf.parse(dateString);
            if (date != null) {
                // 返回时间戳（毫秒）
                return date.getTime();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return 0; // 如果解析失败，返回0
    }

    public static long convertToTimestamp(String dateString) {
        // 定义日期格式与字符串匹配
        @SuppressLint("SimpleDateFormat") SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        sdf.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai")); // 设置为 UTC 时区（可选）
        try {
            // 解析日期字符串
            Date date = sdf.parse(dateString);
            if (date != null) {
                // 返回时间戳（毫秒）
                return date.getTime();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return 0; // 如果解析失败，返回0
    }

    /**
     * 判断 Date 对象是否为今天
     */
    public static boolean isToday(Date date) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault());
        sdf.setTimeZone(timeZone); // 指定输入时间为 UTC

        Calendar today = Calendar.getInstance(timeZone);
        Calendar targetDate = Calendar.getInstance(timeZone);
        targetDate.setTime(date);

        return today.get(Calendar.YEAR) == targetDate.get(Calendar.YEAR) &&
                today.get(Calendar.MONTH) == targetDate.get(Calendar.MONTH) &&
                today.get(Calendar.DAY_OF_MONTH) == targetDate.get(Calendar.DAY_OF_MONTH);
    }

    public static String formatSeconds(long targetTimestampMillis) {
        long now = System.currentTimeMillis(); // 当前时间戳（毫秒）
        long diffMillis = Math.abs(targetTimestampMillis - now); // 时间差（绝对值）

        long totalSeconds = diffMillis / 1000;
        long hours = totalSeconds / 3600;
        long minutes = (totalSeconds % 3600) / 60;
        long seconds = totalSeconds % 60;
        // 判断是过去还是未来
//        String prefix = (targetTimestampMillis >= now) ? "还有" : "已过";
//        return prefix + String.format("%02d小时%02d分%02d秒", hours, minutes, seconds);
        return String.format("%02d小时%02d分%02d秒", hours, minutes, seconds);
    }


    public static boolean isOver16Hours(Date timestampMillis) {
        long nowTime = ZonedDateTime.now(ZoneId.of("Asia/Shanghai")).toInstant().toEpochMilli();
        // 获取当前时间
        long sixteenHoursInMillis = 16 * 60 * 60 * 1000;
        return (nowTime - timestampMillis.getTime()) >= sixteenHoursInMillis;
    }

    public static Date getCustomTime(int num) {
        // 当前时间（上海时区）
        ZonedDateTime now = ZonedDateTime.now(ZoneId.of("Asia/Shanghai"));

        Instant instant = now.minusHours(num).toInstant(); // 获取什么时间的时间戳

        return Date.from(instant); // 时间戳
    }

    public static String getTimeStamp() {
        // 设置时区为 Asia/Shanghai（等效于中国标准时间）
        TimeZone timeZone = TimeZone.getTimeZone("Asia/Shanghai");
        Calendar calendar = Calendar.getInstance(timeZone);

        // 获取当前时间的秒级时间戳
        long timestamp = calendar.getTimeInMillis() / 1000;

        return String.valueOf(timestamp);

    }

    public static String getNo(int storeId) {
        Date now = new Date();
        SimpleDateFormat yearFormat = new SimpleDateFormat("yy");
        SimpleDateFormat monthFormat = new SimpleDateFormat("MM");
        String NO = storeId
                + getTimeStamp().substring(4)
                + yearFormat.format(now)
                + monthFormat.format(now);
        return NO;
    }

    public static int getYear() {
        ZonedDateTime shanghaiTime = ZonedDateTime.now(ZoneId.of("Asia/Shanghai"));
        int year = shanghaiTime.getYear();
        return year;
    }

    public static int getMonth() {
        ZonedDateTime shanghaiTime = ZonedDateTime.now(ZoneId.of("Asia/Shanghai"));
        int month = shanghaiTime.getMonthValue(); // 拿到当前月份没有问题
        return month;
    }

    public static int getDay() {
        ZonedDateTime shanghaiTime = ZonedDateTime.now(ZoneId.of("Asia/Shanghai"));
        int day = shanghaiTime.getDayOfMonth();
        return day;
    }

    // 开始时间不能大于结束时间
    public static boolean startValidate(String startDateStr, String endDateStr) {
        Long startDate = convertToTimestamp(startDateStr);
        Long endDate = convertToTimestamp(endDateStr);
        // 开始日期不能大于结束日期
        if (startDate > endDate) {
            System.out.println("❌ 开始日期不能大于结束日期");
            return false;
        }
        return true; // 校验通过
    }

    // 结束时间不能大于当前时间
    public static boolean beforeValidate(String endDateStr) {
        Long startDate = convertToTimestamp(endDateStr);
        Long endDate = convertToTimestamp(getCurrentTime("yyyy-MM-dd"));
        Log.d("date", "---" + endDateStr);
        Log.d("date", startDate + "---" + endDate);
        // 开始日期不能大于结束日期
        if (startDate > endDate) {
            System.out.println("❌  结束日期不能大于今天");
            return false;
        }
        return true; // 校验通过
    }
}
